package review

import "fmt"

//实现代理模式
//1.分别定义两个接口 一个是代理者 另外一个被代理者
//2.有两个结构体分别去实现方法 代理者结构体中有一个被被代理者结构体
//3.使用代理者结构体去调用被代理者的方法
//案例：中介买卖房

type Proxy interface {
	sellHouse()
	lookHouse()
}

// 中介
type mid struct {
	renter renter
	seller seller
}

func (m *mid) Renter() renter {
	return m.renter
}

func (m *mid) SetRenter(renter renter) {
	m.renter = renter
}

func (m *mid) Seller() seller {
	return m.seller
}

func (m *mid) SetSeller(seller seller) {
	m.seller = seller
}

func newMid() *mid {
	return &mid{}
}

func (m *mid) sellHouse() {
	m.seller.sellHouse()
}

func (m *mid) lookHouse() {
	m.renter.lookHouse()
}

// 租客
type renter struct {
	name string
}

func newRenter(name string) *renter {
	return &renter{name: name}
}

func (r renter) lookHouse() {
	fmt.Println(r.name + "看房子...")
}

// 房东
type seller struct {
	address string
	price   string
}

func newSeller(address string, price string) *seller {
	return &seller{address: address, price: price}
}

func (s seller) sellHouse() {
	fmt.Println("售出房屋地址:" + s.address + "售价:" + s.price)
}
